﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Crosland.Offline.Core;
using Crosland.Offline.Logic;

using Crosland.Offline.WinForm.Properties;
using Crosland.Framework.Base;
using Crosland.Util;

namespace Crosland.Offline.WinForm
{
    public partial class UsuarioEdit : Form
    {
        public UsuarioEdit()
        {            
        }

        public UsuarioEdit(UsuarioList formList)
        {
            InitializeComponent();
            this.CargarDatos();
            this.formList = formList;
        }

        private System.String mensaje;
        public UsuarioList formList;


        public event EventHandler GrabarCompleto;

        /// <summary>
        /// Instancia de Clase que maneja la logica
        /// </summary>
        SeguridadLogic logic = new SeguridadLogic();
        ParametroLogic logicP = new ParametroLogic();
        AlmacenLogic logicA = new AlmacenLogic();

        private System.Boolean indEdicion;

        /// <summary>
        /// Indicacion si es edicion o registro
        /// </summary>
        public System.Boolean IndEdicion
        {
            get { return indEdicion; }
            set { indEdicion = value; }
        }

        /// <summary>
        /// Permite establecer el código del registro
        /// </summary>
        public System.String CodigoRegistro
        {
            get { return this.txtUsuario.Text; }
            set { this.txtUsuario.Text = value; }
        }


        /// <summary>
        /// Permite realizar búsquedas
        /// </summary>
        protected void CargarDatos()
        {           
            this.cblRoles.DataSource = this.logic.BuscarGrupos(null);
            this.cblRoles.DisplayMember = Resources.CampoNombre;
            this.cblRoles.ValueMember = Resources.CampoID;

            this.ddlEstado.DataSource = HelperClass.ListarEstados();
            this.ddlEstado.DisplayMember = Resources.CampoNombre;
            this.ddlEstado.ValueMember = Resources.CampoID;

            this.cboOrgVtas.DataSource = this.logicP.GetByCriteria("organizacion.ventas");
            this.cboOrgVtas.DisplayMember = "DESPARAMETRO";
            this.cboOrgVtas.ValueMember = "DESVALOR";

            this.cboSector.DataSource = this.logicP.GetByCriteria("sector");
            this.cboSector.DisplayMember = "DESPARAMETRO";
            this.cboSector.ValueMember = "DESVALOR";

            this.cboGrupoVendedores.DataSource = this.logicP.GetByCriteria("grupo.vendedores");
            this.cboGrupoVendedores.DisplayMember = "DESPARAMETRO";
            this.cboGrupoVendedores.ValueMember = "DESVALOR";

            this.cboOficinaVentas.DataSource = this.logicP.GetByCriteria("oficina.ventas");
            this.cboOficinaVentas.DisplayMember = "DESPARAMETRO";
            this.cboOficinaVentas.ValueMember = "DESVALOR";

            this.cboAlmacen.DataSource = this.logicA.GetByCriteria(Tools.RetornaParametrosConfiguracion("ParCentro"));
            this.cboAlmacen.DisplayMember = "LGOBE";
            this.cboAlmacen.ValueMember = "LGORT";
        }

        private void UsuarioEdit_Load(object sender, EventArgs e)
        {
            
        }

        /// <summary>
        /// Permite editar los datos de la entidad
        /// </summary>
        public void EditarRegistro(string id)
        {
            Usuario entity = this.logic.ObtenerUsuario(id);

            this.txtUsuario.Text = entity.ID;
            this.txtNombre.Text = entity.DesNombre;
            this.txtApellido.Text = entity.DesApellido;
            this.txtEmail.Text = entity.DesEmail;
            string pwd = this.logic.DesEncriptarPassword(entity.DesPassword);
            this.txtPassword.Text = pwd;         
            this.ddlEstado.SelectedValue = entity.IndEstado;

            cboOrgVtas.SelectedValue = entity.Vkorg != null ? entity.Vkorg : "";
            cboSector.SelectedValue = entity.Spart != null ? entity.Spart : "";
            cboGrupoVendedores.SelectedValue = entity.Vkgrp != null ? entity.Vkgrp : "";
            cboOficinaVentas.SelectedValue = entity.Vkbur != null ? entity.Vkbur : "";
            cboAlmacen.SelectedValue = entity.Lgort != null ? entity.Lgort : "";

            List<UsuarioRol> list = logic.ObtenerGruposPorUsuario(id);

            foreach (UsuarioRol item in list)
            {
                for (int i = 0; i < this.cblRoles.Items.Count; i++)
                {
                    Rol t = this.cblRoles.Items[i] as Rol;

                    if (t.ID == item.ID.IdRol)
                    {
                        this.cblRoles.SetItemChecked(i, true);
                        break;
                    }
                }
            }           
            this.IndEdicion = true;
            this.txtUsuario.Enabled = false;
        }

        /// <summary>
        /// Permite grabar los datos del formulario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                bool flag = this.Grabar();
                if (flag)
                {
                    this.formList.formEdit = this;
                    this.formList.GuardarCompleto();
                    this.Close();
                    this.GrabarCompleto(sender, e);
                }               
            }
            catch
            {
                MessageBox.Show(Resources.MsgErrorGrabar);
            }
        }

        /// <summary>
        /// Permite grabar los datos del formulario
        /// </summary>
        protected bool Grabar()
        {
            if (this.Validar())
            {
                Usuario entity = new Usuario();

                entity.ID = this.txtUsuario.Text;
                entity.DesNombre = this.txtNombre.Text;
                entity.DesApellido = this.txtApellido.Text;
                entity.DesEmail = this.txtEmail.Text;
                entity.UsrCreacion = Globals.UserName;
                entity.IndEstado = this.ddlEstado.SelectedValue.ToString();
                entity.DesPassword = this.logic.EncriptarPassword(this.txtPassword.Text);
                entity.Vkorg = cboOrgVtas.SelectedValue.ToString();
                entity.Spart = cboSector.SelectedValue.ToString();
                entity.Vkgrp = cboGrupoVendedores.SelectedValue.ToString();
                entity.Vkbur = cboOficinaVentas.SelectedValue.ToString();
                entity.Werks = Tools.RetornaParametrosConfiguracion("ParCentro");
                entity.Lgort = cboAlmacen.SelectedValue.ToString();

                List<int> listRoles = new List<int>();

                for (int i = 0; i < this.cblRoles.Items.Count; i++)
                {
                    if (this.cblRoles.GetItemChecked(i))
                    {
                        Rol rol = this.cblRoles.Items[i] as Rol;
                        listRoles.Add(rol.ID);
                    }
                }
                
                bool resultado =  this.logic.GrabarUsuario(entity, !this.IndEdicion, listRoles);

                if (!resultado)
                {
                    MessageBox.Show(Resources.MsgUsuarioExistente);
                    return false;
                }
                return true;
            }
            else 
            {
                MessageBox.Show(mensaje, Resources.TituloConfirmacion, MessageBoxButtons.OK,
                    MessageBoxIcon.Warning);
                return false;
            }
        }

        /// <summary>
        /// Permite validar los datos del formulario
        /// </summary>
        protected bool Validar() 
        {
            StringBuilder msg = new StringBuilder();

            msg.Append(Tools.ValidarCampo(this.txtUsuario, "Usermame",true,TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.txtNombre, "Nombre", true, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.txtApellido, "Apellidos", false, TipoValidacion.Alfanumerico));
            msg.Append(Tools.ValidarCampo(this.txtPassword, "Password", true, TipoValidacion.Ninguno));
            msg.Append(Tools.ValidarCampo(this.txtEmail, "Email", false, TipoValidacion.Email));
            msg.Append(Tools.ValidarCampo(this.ddlEstado, "Estado", true, TipoValidacion.Ninguno));
            msg.Append(Tools.ValidarSeleccionItems(this.cblRoles, "Rol"));

            if (msg.Length > 0)
            {
                mensaje = msg.ToString();
                return false;
            }

            return true;
        }

        /// <summary>
        /// Permite cerrar la ventana
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Permite grabar los datos del formulario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGrabar_Click_1(object sender, EventArgs e)
        {
            try
            {
                bool flag = this.Grabar();
                if (flag)
                {
                    this.formList.formEdit = this;
                    this.formList.GuardarCompleto();
                    this.Close();
                    this.GrabarCompleto(sender, e);
                }
            }
            catch
            {
                MessageBox.Show(Resources.MsgErrorGrabar);
            }
        }

        /// <summary>
        /// Permite cerrar la ventana
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
